'''
在代码运行期间动态增加功能的方式，称之为“装饰器”
decorator就是一个返回函数的高阶函数。
或者
装饰器的本质：一个闭包函数
装饰器的功能：在不修改原函数及其调用方式的情况下对原函数功能进行扩展
'''
# 大方向1:两层装饰器
   #情况1：需要在被装饰的函数运行之前执行某一些特定的验证或者打印之类的功能
    # def deco(func):
    #     @wraps(func) #加在最内层函数正上方
    #     def wrapper(*args,**kwargs):
    #          '''执行函数之前要做的'''
    #         return func(*args,**kwargs)
    #     return wrapper
   #情况2：需要在被装饰的函数运行之后执行某一些特定的功能
    # def timer(func):
    #         @wraps(func)
#     #     def inner(*args,**kwargs):
#     #         '''执行函数之前要做的'''
#     #         re = func(*args,**kwargs)
#     #         '''执行函数之后要做的'''
#     #         return re
#     #     return inner
# 小方向:三层装饰器
def outer(flag):
    def timer(func):
        def inner(*args,**kwargs):
            if flag:
                print('''执行函数之前要做的''')
            re = func(*args,**kwargs)

            print('''执行函数之后要做的''')
            return re
        return inner
    return timer

@outer(False)  #==func1 = outer(index)(func)
def func():
    print(111)

func()





# from functools import wraps
#
# def deco(func):
#     @wraps(func) #加在最内层函数正上方,
# 让被装饰的函数能够正常的执行print(index.__doc__)print(index.__name__)
#     def wrapper(*args,**kwargs):
#         return func(*args,**kwargs)
#     print(id(wrapper))
#     return wrapper
#
# @deco  ==#==> func1 = deco(index)
# def index():
#     '''哈哈哈哈'''
#     print('from index')
#
# print(index.__doc__)
# print(index.__name__)
# print(id(index))
#
